﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.ServiceModel.Activation;
using System.ServiceModel.Web;
using System.Text;
using WebAppPlanProduccion.Code.Contracts;
using Web.Framework.Controls;
using WebAppPlanProduccion.Code;
using PlanProd.Contracts;
using WebAppPlanProduccion.Code.InnerClasses;
using PlanProd.Contracts.enums;
using System.Web;

namespace WebAppPlanProduccion.Svc
{
    [ServiceContract(Namespace = "")]
    [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
    public class Planning
    {
        private WebServiceHelper GetWebServiceHelper()
        {
            WebServiceHelper webServiceHelper = new Code.WebServiceHelper();
            webServiceHelper.ServiceOptionsDefault = new PlanProd.Contracts.Misc.ServiceOptions();
            webServiceHelper.ServiceOptionsDefault.UserName = BaseMasterPage.UserName;
            return webServiceHelper;
        }

        [OperationContract]
        [WebInvoke(Method = "POST", BodyStyle = WebMessageBodyStyle.Wrapped, ResponseFormat = WebMessageFormat.Json)]
        public List<Producto> SearchProduct(string codigoProducto, string descripcionProducto, int presupuestoProduccionId)
        {
            List<Producto> productos = GetWebServiceHelper().GetProductosForPresupuesto(codigoProducto, descripcionProducto, presupuestoProduccionId);
            return productos;
        }

        [OperationContract]
        [WebInvoke(Method = "POST", BodyStyle = WebMessageBodyStyle.Wrapped, ResponseFormat = WebMessageFormat.Json)]
        public string UpdateProducts(int planProdId, List<PlanProdCtrlUpdates> updates, List<int> removedIds)
        {
            List<UpdateCantidadPlanProd> updateList = (from u in updates
                                                       select new UpdateCantidadPlanProd()
                                                       {
                                                           Id = u.Id,
                                                           ProductoId = u.ProductoId,
                                                           NumeroSemana = u.NumeroSemana,
                                                           Cantidad = u.Cantidad
                                                       }).ToList();

            WebServiceHelper webServiceHelper = GetWebServiceHelper();
          
            webServiceHelper.UpdatePresupuestoProduccionItems(planProdId, updateList, removedIds);

            return "Productos Actualizados";
        }

        [OperationContract]
        [WebInvoke(Method = "POST", BodyStyle = WebMessageBodyStyle.Wrapped, ResponseFormat = WebMessageFormat.Json)]
        public string GuardarDesviosMasivos(int tipoDesvioInt, int causaDesvioId, int planProdId, List<DesvioProductoSemana> desvioProductoSemanaList)
        {
            string returnMessage = "Desvios Guardados";
            try
            {               
                CargarDesviosMasivos(false, BaseMasterPage.UserName, tipoDesvioInt, causaDesvioId, planProdId, desvioProductoSemanaList);
            }
            catch (Exception ex)
            {
                returnMessage = ex.Message;
            }
            return returnMessage;          
        }

        [OperationContract]
        [WebInvoke(Method = "POST", BodyStyle = WebMessageBodyStyle.Wrapped, ResponseFormat = WebMessageFormat.Json)]
        public string AprobarDesviosMasivos(int tipoDesvioInt, int causaDesvioId, int planProdId, List<DesvioProductoSemana> desvioProductoSemanaList)
        {
            string returnMessage = "Desvios aprobados";
            try
            {               
                CargarDesviosMasivos(true, BaseMasterPage.UserName, tipoDesvioInt, causaDesvioId, planProdId, desvioProductoSemanaList);
            }
            catch (Exception ex)
            {
                returnMessage = ex.Message;
            }

            return returnMessage;
        }

        public void CargarDesviosMasivos(bool aprobar, string userName, int tipoDesvioInt, int causaDesvioId, int planProdId, List<DesvioProductoSemana> desvioProductoSemanaList)
        {
            WebServiceHelper webServiceHelper = GetWebServiceHelper();
            TipoDesvio tipoDesvio = (TipoDesvio)tipoDesvioInt;

            PlanProduccion planProduccion = webServiceHelper.GetPlanProduccionById(planProdId);            

            List<Desvio> desvios = MiscHelper.CargarDesvios(userName, tipoDesvio, causaDesvioId, planProduccion, desvioProductoSemanaList);
            List<Desvio> desvioResult;

            if (aprobar)
            {
                desvioResult = webServiceHelper.SaveYAprobarDesvioMasivo(desvios, userName, EstadoCharAprobado.Aprobado);
            }
            else
            {
                desvioResult = webServiceHelper.SaveDesvioMasivo(desvios);
            }
        }      
    }
}
